 package org.stvd.service.admin;

import java.util.List;
import java.util.Map;

import org.stvd.common.utils.ServiceResult;
import org.stvd.core.dto.QueryResult;
import org.stvd.entities.admin.Department;
import org.stvd.entities.admin.UserBase;
import org.stvd.entities.admin.UserConfig;
import org.stvd.entities.admin.UserLogin;
import org.stvd.entities.admin.Users;
import org.stvd.service.base.BaseService;

/**
 * @Title: UsersService
 * @Description: 用户业务层接口类
 * @author houzx
 * @date 2020年8月18日
 */
public interface UsersService extends BaseService<Users> {

    /**
     * 根据用户ID获取用户信息
     * @param userId 用户ID
     * @return 返回用户账户及扩展信息（安全账号信息+基本信息+机构信息+角色信息+登录账号信息+平台信息）
     */
    Users findById(String userId);
    
    /**
     * 根据条件查询用户集合
     * @param start 起始
     * @param limit 分页
     * @param loginCode 登录账号
     * @param uname 用户昵称
     * @param depIds 机构ID集合
     * @param roleId 角色ID
     * @param guid 平台ID
     * @return 返回用户集合（包含登录账号+机构+角色扩展信息）
     */
    QueryResult<Users> getUsersQueryResult(int start, int limit, String loginCode, 
        String uname, List<String> depIds, String roleId, String guid);

    /**
     * 更新用户密码
     * @param userId 用户ID
     * @param new_pwd 新密码
     * @throws Exception
     */
    void updatePwd(String userId, String new_pwd) throws Exception;
    
    /**
     * 更新用户密码
     * @param userId 用户ID
     * @param cur_pwd 当前密码
     * @param new_pwd 新密码
     * @throws Exception
     */
    void updatePwd(String userId, String cur_pwd, String new_pwd) throws Exception;
    
    /**
     * 插入一条新的账号信息
     * @param user 实体User
     * @param roleIds 角色ID集合 
     * @param depIds 机构ID集合
     * @param userLogin 实体UserLogin
     * @param userBase 实体UserBase
     * @param guid 平台ID
     * @throws Exception
     */
    void insert(Users user, String[] roleIds, String[] depIds, UserLogin userLogin, UserBase userBase, String guid) throws Exception;

    /**
     * 插入一条新的账号信息
     * @param user 实体User
     * @param roleIds 角色ID集合 
     * @param depIds 机构ID集合
     * @param guids 平台ID集合
     * @param userLogin 实体UserLogin
     * @param userBase 实体UserBase
     * @param guid 平台ID
     * @throws Exception
     */
    void insert(Users user, String[] roleIds, String[] depIds, String[] guids, UserLogin userLogin, UserBase userBase, String guid) throws Exception;
    
    /**
     * 更新账户信息
     * @param users 实体Users
     * @param guids 平台ID集合
     */
    void update(Users users, String[] guids);
    
    /**
     * 更新用户角色机构信息
     * @param roleIds 角色ID集合 
     * @param depIds 机构ID集合
     * @param userId 用户ID
     * @param guid GUID
     */
    void update(String[] roleIds, String[] depIds, String userId, String guid);

    /**
     * 删除用户信息
     * @param userId 用户ID
     * @param guid GUID
     */
    void delete(String userId, String guid);

    /**
     * 重置账户密码
     * @param userId 用户ID
     * @param guid GUID
     * @return
     */
    String clrPwd(String userId, String guid);

    /**
     * 获取父级机构ID列表
     * @param department 实体Department
     * @return 返回父级机构ID列表
     */
    List<String> getParentDepids(Department department);

    /**
     * 根据条件查询用户列表
     * @param userId 用户ID
     * @param depId 机构ID
     * @param depType 机构类型
     * @param guid GUID
     * @return 返回用户安全账号列表
     */
    List<Users> findUsers(String userId, String depId, String depType, String guid);

    /**
     * 设置用户扩展信息，并返回扩展后信息
     * @param userId 用户ID
     * @return
     */
    Map<String, Object> setUserDetailPlus(String userId);

    /**
     * 根据账号类型删除用户登录账号
     * @param userId 用户ID
     * @param loginType 账号类型
     */
    void deleteByIdType(String userId,String loginType);

    /**
     * 插入UserLogin
     * @param userLogin 实体UserLogin 
     */
    void insertUserLogin(UserLogin userLogin);
    
    /**
     * 更新UserLogin
     * @param userLogin 实体UserLogin
     */
    void updateUserLogin(UserLogin userLogin);
    
    /**
     * 更新UserConfig
     * @param userConfig 实体UserConfig
     */
    void updateUserConfig(UserConfig userConfig);
    
    /**
     * @Description: 查询全部账号列表
     * @return
     */
    List<UserLogin> listAllUserLogin();
    /**
     * 获取用户登录账号列表
     * @param userId 用户ID 
     * @return 返回登录账号列表
     */
    List<UserLogin> findUserLoginByUserId(String userId) ;
    
    /**
     * 根据登录账号获取登录账号信息
     * @param loginAccount 登录账号
     * @return 返回登录账号信息
     */
    UserLogin findUserLoginByLoginAccount(String loginAccount);
   
    /**
     * 根据登录账号类型及登录账号获取用户登录账号信息
     * @param loginType 登录账号类型
     * @param loginAccount 登录账号
     * @return 返回登录账号信息
     */
    UserLogin findUserLoginByTypeAccount(String loginType, String loginAccount);
    
    /**
     * 根据用户ID及账号类型查询登录账号信息
     * @param userId 用户ID
     * @param loginType 账号类型
     * @return 返回登录账号信息
     */
    UserLogin findUserLoginByIDType(String userId, String loginType);

    /**
     * 用户绑定手机号码
     * @param userId 用户ID
     * @param mobileStr 手机号码
     * @param validateCode 验证码
     * @return 返回绑定结果
     */
    ServiceResult<Map<String, Object>> bindingUserMobile(String userId, String mobileStr, String validateCode);

    /**
     * 用户绑定电子邮箱
     * @param userId 用户ID
     * @param emailStr 电子邮件
     * @param validateCode 验证码
     * @return 返回绑定结果
     */
    ServiceResult<Map<String, Object>> bindingUserEmail(String userId, String emailStr, String validateCode);

    /**
     * 用户使用手机号重置密码
     * @param mobileNumStr 手机号码
     * @param verifyCodeStr 验证码
     * @param newPassword 新密码
     * @param confirmPassword 确认密码
     * @return 返回重置结果
     */
    ServiceResult<Map<String, Object>> resetpwdForUserMobile(String mobileNumStr, String verifyCodeStr, 
        String newPassword, String confirmPassword);
    
    /**
     * 用户使用邮箱重置密码
     * @param emailNumStr 电子邮件
     * @param verifyCodeStr 验证码
     * @param newPassword 新密码
     * @param confirmPassword 确认密码
     * @return 返回重置结果
     */
    ServiceResult<Map<String, Object>> resetpwdForUserEmail(String emailNumStr, String verifyCodeStr, 
        String newPassword, String confirmPassword);

    
    /**
     * 用户使用手机号注册账号
     * @param mobileStr 手机号码
     * @param userName 用户名称
     * @param validateCode 手机验证码
     * @param password 账号密码
     * @param confirmPassowrd 确认密码
     * @param defaultRoleCode 默认角色编码
     * @param DefaultDepCode 默认机构编码
     * @param guid 平台GUID
     * @param url 来源网址
     * @return
     */
    ServiceResult<Map<String, Object>> registAccountForUserMobile(String mobileStr, String userName, String validateCode, 
        String password, String confirmPassowrd, String defaultRoleCode, String DefaultDepCode, String guid, String url);
    
    /**
     * 用户注册账号
     * @param loginCode 登录账号
     * @param loginType 账号类型
     * @param userName 用户名称
     * @param validateCode 手机验证码
     * @param password 账号密码
     * @param confirmPassowrd 确认密码
     * @param defaultRoleCode 默认角色编码
     * @param DefaultDepCode 默认机构编码
     * @param guid 平台GUID
     * @param url 来源网址
     * @return
     */
    ServiceResult<Map<String, Object>> registAccount(String loginCode, String loginType, String userName, String validateCode, 
        String password, String confirmPassowrd, String defaultRoleCode, String DefaultDepCode, String guid, String url);
    
    /**
     * 变更用户账户状态
     * @param userId 用户ID
     * @param status 状态{T:启用；F：禁用；}
     */
    void changeUserStatus(String userId, String status); 

    /**
     * @Description: 注销账号
     * @param userId 用户ID
     * @return
     */
    ServiceResult<Map<String, Object>> delUser(String userId);

}
